#pragma once

#include "iostream"
#include "vector"
#include "algorithm"
#include "stack"

using namespace std;
/*HJJ QQ479287006
 给你一个字符串表达式 s ，请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数，比如 eval() 。



示例 1：

输入：s = "1 + 1"
输出：2
示例 2：

输入：s = " 2-1 + 2 "
输出：3
示例 3：

输入：s = "(1+(4+5+2)-3)+(6+8)"
输出：23


提示：

1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
'+' 不能用作一元运算(例如， "+1" 和 "+(2 + 3)" 无效)
'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数*
 * */

//符号+ - * /
stack<long> nums;
stack<char> fuhao;

//符号+ - * /
int getCharNum(char ch) {
    switch (ch) {
        case '+':
            return 1;
        case '-':
            return 1;
        case '*':
            return 3;
        case '/':
            return 3;

    }


    return -1;

}


void calc() {
    char fu = fuhao.top();
    fuhao.pop();
    long second = nums.top();
    nums.pop();
    long first = nums.top();
    nums.pop();

    switch (fu) {
        case '+':
            nums.push(first + second);

            break;
        case '-':
            nums.push(first - second);
            break;
        case '*':

            nums.push(first * (second));
            break;

        case '/':
            nums.push(first / (second));
            break;


    }


}


// " 3+5 / 2 "
int calculate(string s) {
    nums.push(0);
    for (int i = 0; i < s.size(); i++) {
        int start = i;
        //人有点傻了
        while (s[i] >= '0' && s[i] <= '9') {
            i++;
        }
        int size = i - start;
        if (size > 0) {
            string temp = s.substr(start, size);
            nums.push(stoi(temp));
        }
        // " 3+5 / 2+1 "
        if (s[i] == '(') {
            fuhao.push('(');
            //如果下一个非null的操作数不是数字需要push 0
            int temp = i + 1;
            while (s[temp] == ' ')
                temp++;
            //如果上来就搞一个符号
            if (s[temp] == '-')
                nums.push(0);
        } else if (s[i] == ')') {
            while (fuhao.top() != '(') {
                calc();
            }

            if (fuhao.top() == '(')
                fuhao.pop();

        } else if (s[i] == '+') {
            while (!fuhao.empty() && getCharNum('+') <= getCharNum(fuhao.top())) {
                calc();
            }

            fuhao.push('+');

        } else if (s[i] == '-') {
            while (!fuhao.empty() && getCharNum('-') <= getCharNum(fuhao.top())) {
                calc();
            }

            fuhao.push('-');
        } else if (s[i] == '*') {

            while (!fuhao.empty() && getCharNum('*') <= getCharNum(fuhao.top())) {
                calc();
            }
            fuhao.push('*');

        } else if (s[i] == '/') {
            while (!fuhao.empty() && getCharNum('/') <= getCharNum(fuhao.top())) {
                calc();
            }
            fuhao.push('/');
        }


    }

    // 3+2+1
    while (!fuhao.empty()) {
        calc();
    }


    return (int) nums.top();

}